package com.ruoyi.depot.mapper;

import com.ruoyi.depot.domain.InboundProducts;
import com.ruoyi.depot.domain.vo.SelectedOrderVO;
import com.ruoyi.depot.domain.vo.VoOrdersProduct;
import com.ruoyi.depot.domain.vo.VoOrdersTime;
import com.ruoyi.depot.domain.dto.OrdersProductUpdateDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 货币单位Mapper接口
 * 
 * @author ruoyi
 * @date 2023-11-02
 */
@Mapper
public interface VoOrdersProductMapper
{

    /**
     * 通过采购单id来查询要入库的数据
     * @param voOrdersProduct 采购单id
     * @return 结果
     */
    public List<VoOrdersProduct> selectVoOrdersProductByOrdersId(@Param("voOrdersProduct") VoOrdersProduct voOrdersProduct);

    /**
     * 通过采购单id来查询要入库的数据
     * @param voOrdersProduct 采购单id
     * @return 结果
     */
    public List<VoOrdersProduct> selectVoOrdersProductByOrderId(@Param("voOrdersProduct") VoOrdersProduct voOrdersProduct,
                     @Param("ordersProductIds") Long[] ordersProductIds);

    /**
     * 通过产品id来查询要入库的数据
     * @param voOrdersProduct
     * @return
     */
    public List<VoOrdersProduct> selectVoOrdersProductByProductId(@Param("voOrdersProduct") VoOrdersProduct voOrdersProduct);

    /**
     * 修改是否选择的状态
     * @param ids
     * @param selectedStatus
     * @return
     */
    public int updateVoOrdersProductBySelectedStatus(@Param("ids") String[] ids,@Param("selectedStatus") String selectedStatus);

    /**
     * 查询最先创建的数据
     * @param ordersId
     * @return
     */
    public List<VoOrdersTime> selectOrdersTime(@Param("ordersId") Long ordersId, @Param("id") String id);

    /**
     * 查询入库编号
     * @return
     */
    public String selectStorageNumber();

    /**
     * 修改未入库的数据
     * @param inboundProductsList
     * @return
     */
    public int updateOrdersProductNotStockedNumber(List<InboundProducts> inboundProductsList);

    /**
     * 查询入库的产品SubProductId
     * @param ordersId
     * @param productId
     * @return
     */
    public Long selectSubProductId(@Param("ordersId") Long ordersId,@Param("productId") Long productId);

    /**
     * 通过id查询所以的产品明细数据
     * @param ids
     * @return
     */
    public List<VoOrdersProduct> selectByIds(@Param("ids") Long[] ids);

    /**
     * 通过id修改产品明细是否选中的状态
     * @param ids
     * @param detailsStatus
     * @return
     */
    public int updateByIdDetailsStatus(@Param("ids") Long[] ids,@Param("detailsStatus") String detailsStatus);

    /**
     * 取消
     * @param voOrdersProductList
     * @return
     */
    public int updateDetailsStatus(@Param("voOrdersProductList") List<VoOrdersProduct> voOrdersProductList);

    /**
     * 修改产品明细表
     * @param ids
     * @param detailsStatus
     * @param unnotifiedQuantity
     * @param notifiedCount
     * @return
     */
    public int updateById(@Param("ids") Long[] ids,
                          @Param("detailsStatus") String detailsStatus,
                          @Param("unnotifiedQuantity") Long unnotifiedQuantity,
                          @Param("notifiedCount") Long notifiedCount,
                          @Param("gtin") String gtin);

    /**
     * 修改初始表的数据
     * @param ordersId
     * @param productId
     * @param notificationQuantity
     * @return
     */
    public int updateReceiptList(@Param("ordersId") Long ordersId,@Param("productId") Long productId,@Param("notificationQuantity") Long notificationQuantity);

    /**
     * 先查询采购数量和未通知量进行对比是否显示
     * @param ordersId
     * @param productId
     * @return
     */
    public VoOrdersProduct selectReceipt(@Param("ordersId") Long ordersId,@Param("productId") Long productId);

    /**
     * 查询产品明细表的和修改明细表是否有对应的数据
     * @param ordersId
     * @return
     */
    public List<VoOrdersProduct> selectListProductId(@Param("ordersId") Long ordersId);

    /**
     * 修改是否选择的状态
     * @param id
     * @return
     */
    public int updateProductIdDetailsStatus(@Param("id") Long id);

    /**
     * 修改的时候取消需要判断是否选择的状态
     * @param detailsStatus
     * @param ordersId
     * @param productId
     * @return
     */
    public int updateTestDetailsStatus(@Param("detailsStatus") String detailsStatus,@Param("ordersId") Long ordersId, @Param("productId") Long productId);

    /**
     * 通过收货单明细表id来查询要入库的数据
     * @param voOrdersProduct 采购单id
     * @param ordersProductIds 采购明细表id
     * @return 结果
     */
    public List<VoOrdersProduct> selectHaveReceiptProductsListBYId(@Param("voOrdersProduct") VoOrdersProduct voOrdersProduct ,
                   @Param("ordersProductIds") Long[] ordersProductIds, @Param("receiptProductIds") Long[] receiptProductIds );

    /**
     * 通过收货单明细表id来查询要入库的数据
     * @param voOrdersProduct 采购单id
     * @param ordersProductIds 采购明细表id
     * @return 结果
     */
    public List<VoOrdersProduct> selectHaveReceiptProductsListBYReceiptId(@Param("voOrdersProduct") VoOrdersProduct voOrdersProduct ,
                 @Param("ordersProductIds") Long[] ordersProductIds);

    /**
     * 修改【tb_orders_product】采购订单明细表的对应商品已通知量，未通知量
     * @param ordersProductId
     * @param newNotifiedCount
     * @param newUnNotifiedQuantity
     * @param nowDate
     * @return
     */
    public void updateOrdersProductByParams(@Param("ordersProductId") String ordersProductId, @Param("newNotifiedCount") Long newNotifiedCount,
                @Param("newUnNotifiedQuantity") Long newUnNotifiedQuantity,@Param("nowDate")Date nowDate);

    /**
     * 删除收货单后更新采购商品订单表中对应的已通知收货量和未通知收货量
     * @param ordersId
     * @param productId
     * @param nowNotifiedCount
     * @param nowUnNotifiedQuantity
     */
    void updateOrdersProduct(@Param("ordersId") Long ordersId,
                             @Param("productId") Long productId,
                             @Param("nowNotifiedCount") Long nowNotifiedCount,
                             @Param("nowUnNotifiedQuantity") Long nowUnNotifiedQuantity,
                             @Param("gtin") String gtin);

    /**
     * 根据采购订单id查询出对应的采购商品数据
     * @param ordersIds
     * @return
     */
    List<SelectedOrderVO> selectByReceiptOrdersIdList(@Param("ordersIds") Long[] ordersIds);

    /**
     * 批量更新采购订单商品表
     * @param updateList
     * @return
     */
    int batchUpdate(@Param("updateList") List<OrdersProductUpdateDTO> updateList);
}
